/*****************************************************************
 Jorge Lainfiesta                CarnÃ© 11142
 Rodrigo Medrano                 CarnÃ© 11222
 Luis Fernando Valdeavellano     CarnÃ© 11218
 SecciÃ³n 21

 Interfaz.java
*****************************************************************/

import javax.swing.*;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;

public class Interfaz {

    public static Manejador manejador;
    
    public static void main(String[]args){
        manejador = new Manejador();
        Recursos quemados = new Recursos();
        manejador.asignarRecursos(quemados);
        
        menuPrincipal();
    }

    //MenÃº principal.
    public static void menuPrincipal(){
        String[] options = { "Administrar Recursos", "Comprar Boleto", "Registrar Vuelo","Informes", "Cancelar Vuelo"};
        int opc=-2;

        while(opc!=-1){
            opc = dialogButtons("Menú Principal", "¿Qué desea hacer? Seleccione una opción de abajo.", options);
            switch(opc){
                case 0: admRecursos(); break;
                case 1: comBoleto(); break;
                case 2: regVuelo(); break;
                case 3: informes(); break;
                case 4: cancVuelo(); break;
            }
        }
        

    }

    //Parte para ingreso de aeropuertos
    public static void admRecursos(){
           String[] options = {"Aeropuertos", "Aerolineas", "Avion", "Persona"};
           String title = "Administrar Recursos";
           String opc = dialogSelect(title, "Â¿QuÃ© desea agregar?", options);

           if(opc!=null){

              if(opc.equals(options[0])){ //Si es la primera opciÃ³n (Aeropuertos)
                   String nom = dialogInput(title,"Ingresar nombre del Aeropuerto");

                   if(nom!=null){ //Si ingresÃ³ algo el usuario, seguimos pidiendo datos...
                       String dir = dialogInput(title,"Ingresar direcciÃ³n del Aeropuerto");

                       if(dir!=null){ //Si ingresÃ³ algo... continuamos
                           int inter = dialogConfirm(title, "Â¿Es un aeropuerto internacional?");

                           if(inter!=-1){ //Si no fue cancelado... continuamos

                               boolean internacional = false;
                               if(inter==0)
                                   internacional = true;

                               Aeropuerto nuevo = new Aeropuerto(nom, dir, internacional);

                               manejador.getAeropuertos().add(nuevo); //Se agrega el nuevo aeropuerto a los aeropuertos
                               dialogMessage(title, "Se ha agregado "+nuevo.getNombre()+" con exito.");
                           }
                       }
                   }

              }else if(opc.equals(options[1])){
                  String nom = dialogInput(title, "Ingrese el nombre de la Aerolinea.");
                  if(nom!=null){
                      Aerolinea nueva = new Aerolinea(nom);
                      manejador.getAerolineas().add(nueva);
                      dialogMessage(title, "Se ha agregado "+nueva.getNombre()+" con exito.");
                  }
              }else if(opc.equals(options[2])){
                  String id = dialogInput(title, "Ingrese el ID-Nombre del AviÃ³n");
                  Avion nuevo = new Avion(id);
                  if(id!=null){
                      int asientos = dialogIntInput(title, "Ingrese la cantidad de asientos Primera Clase.");
                      if(asientos!=-1){
                          nuevo.setAsientosPrimera(asientos);

                          asientos = dialogIntInput(title, "Ingrese la cantidad de asientos Ejecutivos.");
                          if(asientos!=-1){
                              nuevo.setAsientosEjecutiva(asientos);

                              asientos = dialogIntInput(title, "Ingrese la cantidad de asientos clase Turista.");
                              if(asientos!=-1){
                                  nuevo.setAsientosTurista(asientos);

                                  String nombres[] = manejador.getAerolineasString();

                                  String selected = dialogSelect(title, "Â¿A quÃ© aerolÃ­nea desea asignar el aviÃ³n?", nombres);
                                  if(selected!=null){
                                      int indice = manejador.posicion(selected, nombres);

                                      Aerolinea buscado = manejador.getAerolineas().get(indice);

                                      buscado.getFlotillaAviones().add(nuevo);
                                      dialogMessage(title, "Se ha agregado "+nuevo.getId()+" con exito.");
                                  }
                              }
                          }
                      }
                  }
              }else if(opc.equals(options[3])){
                  String nombre = dialogInput(title, "Â¿CuÃ¡l es el nombre de la persona?");
                  Persona nuevo = new Persona();
                  if(nombre!=null){
                      nuevo.setNombre(nombre);
                      String cargos[] = {"Piloto", "Aeromozas", "Administrativo"};
                      String cargo = dialogSelect(title, "Â¿CuÃ¡l es su cargo?", cargos);
                      if(cargo!=null){
                          nuevo.setCargo(cargo);
                          
                          String nombres[] = manejador.getAerolineasString();
                          String selected = dialogSelect(title, "Â¿A quÃ© aerolÃ­nea desea asignar la persona?", nombres);
                          if(selected!=null){
                             int indice = manejador.posicion(selected, nombres);
                             Aerolinea aerolinea = manejador.getAerolineas().get(indice);
                             
                             if(cargo.equals(cargos[0])){
                                 aerolinea.addPiloto(nuevo);
                             }else if(cargo.equals(cargos[1])){
                                 aerolinea.addAeromosa(nuevo);
                             }else{
                                 aerolinea.addAdministrativo(nuevo);
                             }
                             dialogMessage(title, "Se ha agregado "+nuevo.getNombre()+" con exito.");
                          }
                      }
                  }
              }
           }
       }
    
          public static void comBoleto(){
         String title="Comprar Boleto";
         String nombre = dialogInput(title, "Ingrese su nombre");
         Boleto nuevo = new Boleto();
          if(nombre!=null){
              nuevo.setNombre(nombre);
              int totVuelos = manejador.getVuelos().size();
              if(totVuelos>0){
                  String vuelos[] = new String[totVuelos];
                  for(int i=0; i<vuelos.length; i++){
                      Vuelo este = manejador.getVuelos().get(i);
                      Aeropuerto llegada = este.getAeropuertoLlegada();
                      Aeropuerto salida = este.getAeropuertoSalida();
                      vuelos[i]= este.getId()+": "+salida.getNombre()+"("+salida.getDireccion()+")"+" – "+llegada.getNombre()+"("+llegada.getDireccion();
                      System.out.println(vuelos[i]);
                  }
                  String vuelosele  = dialogSelect(title, "Seleccione un vuelo", vuelos);
                  if(vuelosele!=null){
                      int ind = manejador.posicion(vuelosele, vuelos);
                      nuevo.setVuelo(manejador.getVuelos().get(ind));
                      
                      Vuelo deseado = manejador.getVuelos().get(ind);
                      String clases[] = {"Primera Clase", "Clase ejecutiva", "Clase Turista"};
                      String clase = dialogSelect(title, "Qué clase desea", clases);
                      if(clase!=null){
                          if(clase.equals(clases[0])){
                              int cant = deseado.getAvion().getAsientosPrimera();
                              if(cant>0){
                                  deseado.getAvion().setAsientosPrimera(cant-1);
                                  dialogMessage(title, "Se ha comprado el boleto");
                                  manejador.getBoletos().add(nuevo);
                              }
                          }else if(clase.equals(clases[1])){
                              int cant = deseado.getAvion().getAsientosEjecutiva();
                              if(cant>0){
                                  deseado.getAvion().setAsientosEjecutiva(cant-1);
                                  dialogMessage(title, "Se ha comprado el boleto");
                                  manejador.getBoletos().add(nuevo);
                              }
                          }else {
                              int cant = deseado.getAvion().getAsientosTurista();
                              if(cant>0){
                                  deseado.getAvion().setAsientosTurista(cant-1);
                                  dialogMessage(title, "Se ha comprado el boleto");
                                  manejador.getBoletos().add(nuevo);
                              }
                          }
                      }
                  }
              }else{
                  dialogMessage(title, "No hay vuelos disponibles");
              }
          }
    }
    
    public static void regVuelo(){
        String title = "Registrar Vuelo";
        
        Vuelo nuevo = new Vuelo();
        
        String[] options = new String[manejador.getAeropuertos().size()];
        int i=0;
        for(Aeropuerto aeropuerto : manejador.getAeropuertos()){
            options[i]=aeropuerto.getNombre();
            i++;
        }
        String salida = dialogSelect(title, "Â¿De quÃ© aeropuerto sale el vuelo?", options);
        if (salida!=null){
            int indice = indice = manejador.posicion(salida,manejador.getAeropuertosString());
            Aeropuerto aeropuertoSalida = manejador.getAeropuertos().get(indice);
            nuevo.setAeropuertoSalida(aeropuertoSalida);
            
            if(!aeropuertoSalida.esInternacional()){
                i=0;
                for(Aeropuerto aeropuerto : manejador.getAeropuertos())
                    if(aeropuerto.getDireccion().equals(aeropuertoSalida.getDireccion()))
                        i++;
                options = new String[i];
                i=0;
                for(Aeropuerto aeropuerto : manejador.getAeropuertos()){
                    if(aeropuerto.getDireccion().equals(aeropuertoSalida.getDireccion())){
                        options[i] = aeropuerto.getNombre();
                        i++;
                    }
                }
            }
            String llegada = dialogSelect(title, "Â¿A quÃ© aeropuerto llega el vuelo?", options);
            if(llegada!=null){
                indice = manejador.posicion(llegada,manejador.getAeropuertosString());
                Aeropuerto aeropuertoLlegada = manejador.getAeropuertos().get(indice);
                nuevo.setAeropuertoSalida(aeropuertoSalida);
                nuevo.setAeropuertoLlegada(aeropuertoLlegada);
                
                if(!aeropuertoSalida.esInternacional())
                    nuevo.setEsInternacional(false);
                else
                    nuevo.setEsInternacional(true);
                boolean inter = nuevo.isEsInternacional();
                
                options = new String[manejador.getAerolineas().size()];
                i=0;
                for(Aerolinea aerolinea : manejador.getAerolineas()){
                    options[i]=aerolinea.getNombre();
                    i++;
                }
                String aero = dialogSelect(title, "Â¿QuÃ© aerolinea opera el vuelo?", options);
                if(aero!=null){
                    indice = manejador.posicion(aero,options);
                    Aerolinea aerolinea = manejador.getAerolineas().get(indice);
                    nuevo.setAerolinea(aerolinea);

                    options = new String[aerolinea.getFlotillaAviones().size()];
                    i=0;
                    int j = 0;
                    for(Avion avion : aerolinea.getFlotillaAviones()){
                        if(!inter && !avion.vuelaInternacional()){
                            options[j]=avion.getId();
                            j++;
                        }
                        else if(inter){
                            options[i]=avion.getId();
                            i++;
                        }
                    }
                    if(!inter){
                        String[] ops = new String[j];
                        i=0;
                        String vacio = "";
                        for(String option : options){
                            if(option!=null){
                                ops[i]=option;
                            }
                        }
                        options = ops;
                    }
                    String avn = dialogSelect(title, "AviÃ³n del vuelo", options);
                    if(avn!=null){
                        indice = manejador.posicion(avn,options);
                        Avion avion = aerolinea.getFlotillaAviones().get(indice);
                        nuevo.setAvion(avion);

                        options = new String[aerolinea.getPilotos().size()];
                        i=0;
                        for(Persona piloto : aerolinea.getPilotos()){
                            options[i]=piloto.getNombre();
                            i++;
                        }
                        String pilot = dialogSelect(title, "Piloto del vuelo", options);
                        if(pilot!=null){
                            indice = manejador.posicion(pilot,options);
                            Persona piloto = aerolinea.getPilotos().get(indice);
                            nuevo.setPilotoAsignado(piloto);

                            boolean seguirAeromozas = true;
                            boolean primeraVuelta = true;
                            String aeromoz = "";
                            int cont=0;
                            while (seguirAeromozas){
                                if(!primeraVuelta){
                                    cont = dialogConfirm(title, "Desea agregar otra aeromoza?");
                                    if (cont!=-1){
                                        seguirAeromozas = false;
                                        if(cont==0)
                                            seguirAeromozas = true;
                                    }
                                }
                                if (seguirAeromozas && cont==0){
                                    options = new String[aerolinea.getAeromosas().size()];
                                    i=0;
                                    for(Persona aeromoza : aerolinea.getAeromosas()){
                                        options[i]=aeromoza.getNombre();
                                        i++;
                                    }
                                    aeromoz = dialogSelect(title, "Ingrese una aeromoza para el vuelo", options);
                                    if(aeromoz!=null){
                                        indice = manejador.posicion(aeromoz,options);
                                        Persona aeromoza = aerolinea.getAeromosas().get(indice);
                                        nuevo.getAeromosas().add(aeromoza);
                                    }
                                    primeraVuelta=false;
                                }
                            }
                            if(aeromoz!=null && cont!=-1){
                                
                                Date despegue = dialogDateInput(title,"Ingrese la fecha y hora de despegue");
                                if(despegue!=null){
                                    nuevo.setDespegue(despegue);
                                    Date aterrizaje = dialogDateInput(title, "Ingrese la fecha y hora de aterrizaje");
                                    if(aterrizaje!=null){
                                        nuevo.setAterrizaje(aterrizaje);
                                        int conf = dialogConfirm(title, "Desea registrar un vuelo con las siguientes caracterÃ­sticas:\n"+salida+"\n"+llegada+"\n"+aero+"\n"+avn+"\n"+pilot+"\n"+despegue+"\n"+aterrizaje);
                                        if (conf!=-1){
                                            boolean confirm = false;
                                            if(conf==0){
                                                confirm = true;
                                                manejador.addVuelo(nuevo);
                                                dialogMessage(title, "Se ha registrado el vuelo con Ã©xito");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    public static void informes(){
        String[] options = {"Aeropuertos", "Aerolineas", "Avion", "Piloto", "Aeromoza", "Vuelos", "Vuelos Cancelados"};
        String title = "Informes";
        String opc = dialogSelect(title, "Â¿QuÃ© desea?", options);
        if(opc!=null){

              if(opc.equals(options[0])){ //Si es la primera opciÃ³n (Aeropuertos)
                  String aeropInf[] = manejador.getAeropuertosString();
                  String avionStrg = "";
                  for (String nombre : aeropInf){
                      avionStrg += "\n"+nombre;
                      }
                  dialogMessage(title, avionStrg);
              }
              if(opc.equals(options[1])){ //Si es la segunda opciÃ³n (AerolÃ­neas)
                  String aerolInf[] = manejador.getAerolineasString();
                  String avionStrg = "";
                  for (String nombre : aerolInf){
                      avionStrg += "\n"+nombre;
                      }
                  dialogMessage(title, avionStrg);
              }
              if(opc.equals(options[2])){ //Si es la tercera opciÃ³n (Aviones)
                  String[] options2 = new String[manejador.getAerolineas().size()];
                  int i=0;
                  for(Aerolinea aerolinea : manejador.getAerolineas()){
                    options2[i]=aerolinea.getNombre();
                    i++;
                  }
                  String aerol1 = dialogSelect(title, "Seleccionar aerolinea", options2);
                  int indice = manejador.posicion(aerol1, options2);
                  Aerolinea seleccionar = manejador.getAerolineas().get(indice);
                  String avionStrg = "";
                  for (Avion avion : seleccionar.getFlotillaAviones()){
                      avionStrg += "\n"+avion.getId();
                      }
                  dialogMessage(title, avionStrg);
               }
                if(opc.equals(options[3])){ //Si es la cuarta opciÃ³n (Piloto)
                  String[] options3 = new String[manejador.getAerolineas().size()];
                  int i=0;
                  for(Aerolinea aerolinea : manejador.getAerolineas()){
                    options3[i]=aerolinea.getNombre();
                    i++;
                  }
                  String aerol2 = dialogSelect(title, "Seleccionar aerolinea", options3);
                  int indice = manejador.posicion(aerol2, options3);
                  Aerolinea seleccionar2 = manejador.getAerolineas().get(indice);
                  String pilotoStrg = "";
                  for (Persona piloto : seleccionar2.getPilotos()){
                      pilotoStrg += "\n"+piloto.getNombre();
                      }
                  dialogMessage(title, pilotoStrg);
                  }
                if(opc.equals(options[4])){ //Si es la quinta opciÃ³n (Aeromoza)
                  String[] options4 = new String[manejador.getAerolineas().size()];
                  int i=0;
                  for(Aerolinea aerolinea : manejador.getAerolineas()){
                    options4[i]=aerolinea.getNombre();
                    i++;
                  }
                  String aerol3 = dialogSelect(title, "Seleccionar aerolinea", options4);
                  int indice = manejador.posicion(aerol3, options4);
                  Aerolinea seleccionar3 = manejador.getAerolineas().get(indice);
                  String aeromozaStrg = "";
                  for (Persona aeromoza : seleccionar3.getAeromosas()){
                      aeromozaStrg += "\n"+aeromoza.getNombre();
                      }
                  dialogMessage(title, aeromozaStrg);
                  }
              if(opc.equals(options[5])){ //Si es la sexta opciÃ³n (Aeropuertos)
                  String vuelInf[] = manejador.getVuelosString();
                  String vuelStrg = "";
                  for (String nombre : vuelInf){
                      vuelStrg += "\n"+nombre;
                      }
                  dialogMessage(title, vuelStrg);
                }
                if(opc.equals(options[6])){ //Si es la séptima opciÃ³n (Aeropuertos)
                  String vuelcInf[] = manejador.getVuelosCanceladosString();
                  String vuelcStrg = "";
                  for (String nombre : vuelcInf){
                      vuelcStrg += "\n"+nombre;
                      }
                  dialogMessage(title, vuelcStrg);
                }
                  }


              }
    
    //Método para cancelar vuelos
    public static void cancVuelo(){
        int totVuelos = manejador.getVuelos().size();
        String title="Cancelar Vuelo";
              if(totVuelos>0){
                  String vuelos[] = new String[totVuelos];
                  for(int i=0; i<vuelos.length; i++){
                      Vuelo este = manejador.getVuelos().get(i);
                      Aeropuerto llegada = este.getAeropuertoLlegada();
                      Aeropuerto salida = este.getAeropuertoSalida();
                      vuelos[i]= este.getId()+": "+salida.getNombre()+"("+salida.getDireccion()+")"+" – "+llegada.getNombre()+"("+llegada.getDireccion()+")";
                      System.out.println(vuelos[i]);
                  }
                  String vuelosele  = dialogSelect(title, "Seleccione un vuelo", vuelos);
                  if(vuelosele!=null){
                      int ind = manejador.posicion(vuelosele, vuelos);
                      Vuelo cancelado = manejador.getVuelos().get(ind);

                      Date despegue = cancelado.getDespegue();
                      Date aterri = cancelado.getAterrizaje();

                      Date now = new Date();

                      if(!(now.compareTo(despegue)<0)){
                          dialogMessage(title, "No se puede cancelar. Está en vuelo");
                      }else{
                          manejador.getVuelosCancelados().add(cancelado);
                          manejador.getVuelos().remove(ind);
                      }
                  }
             }else{
                dialogMessage(title, "No hay vuelos");
             }

    }
    
    //Recibe lo mÃ­nimo para mostrar un diÃ¡logo con botones. Retorna la opciÃ³n seleccionada por el usuario.
    public static int dialogButtons(String titulo, String mensaje, Object[]options){
        int result =  JOptionPane.showOptionDialog(null, mensaje, titulo,
            JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE,
            null, options, options[0]);

        return result;

    }

    //Recibe un tÃ­tulo y mensaje para crear un diÃ¡logo de confirmaciÃ³n.
    public static int dialogConfirm(String titulo, String mensaje){
        return JOptionPane.showConfirmDialog(null,
            mensaje, titulo, JOptionPane.YES_NO_OPTION);
    }

    //Recibe lo mÃ­nimo para mostrar un diÃ¡logo con opciones a seleccionar. Retorna la opciÃ³n seleccionada.
    public static String dialogSelect(String titulo, String mensaje, Object[]options){
        Object selected = JOptionPane.showInputDialog(null,
            mensaje, titulo,
            JOptionPane.INFORMATION_MESSAGE, null,
            options, options[0]);
        
        return (String) selected;
    }

    //Recibe el tÃ­tulo y mensaje. Retorna el valor ingresado por el usuario
    public static String dialogInput(String titulo, String mensaje){
        return JOptionPane.showInputDialog(null, mensaje, titulo, JOptionPane.QUESTION_MESSAGE);
    }

    //Recibe el tÃ­tulo y mensaje. Retonra un int ingresado.
    public static int dialogIntInput(String titulo, String mensaje){
        boolean repeat = true;
        int result = -1;
        while(repeat){
            String input = JOptionPane.showInputDialog(null, mensaje, titulo, JOptionPane.QUESTION_MESSAGE);
            if(input==null)
                break;
            try{
                result = Integer.parseInt(input);
                repeat = false;
            }catch(NumberFormatException e){
                repeat = true;
            }
        }

        return result;
    }

    //Recibe un título y mensaje. Retorna un Date.
    public static Date dialogDateInput(String titulo, String mensaje){
        boolean repeat = true;
        Date result = null;
        while(repeat){
            String input = JOptionPane.showInputDialog(null, mensaje, titulo, JOptionPane.QUESTION_MESSAGE);
            if(input==null)
                break;
            try{
                DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm");
                result = df.parse(input);
                repeat = false;
            }catch(ParseException e){
                repeat = true;
            }
        }

        return result;
    }

    //Recibe un tÃ­tulo y mensaje a mostrar.
    public static void dialogMessage(String titulo, String mensaje){
        JOptionPane.showMessageDialog(null, mensaje, titulo, JOptionPane.INFORMATION_MESSAGE);
    }

}